package com.parking.order.client.inter;

import com.parking.common.core.model.Result;
import com.parking.order.client.dto.StallDto;
import com.parking.order.client.dto.StallRentDto;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(name = "parking-stall", path = "/stall")
public interface StallClient {
    /**
     * 根据ID查询车位信息
     * 参数: 车位信息Id   stallInfoId
     * 返回: 车位信息Id   stallInfoId
     *      车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * 方法: 1.判断stallInfoId是否存在对应的车位信息 若不存在则抛异常 若下架也抛异常
     *      2.将车位信息放入Dto返回
     * */
    @GetMapping("/stallInfo/selectStallInfoById")
    @ApiOperation("根据ID查询车位相关信息")
    Result<StallDto> selectStallInfoById(@RequestParam("stallInfoId") Integer stallInfoId);
    /**
     * 根据ID查询车位相关信息 无论是否下架
     * 参数: 车位信息Id   stallInfoId
     * 返回: 车位信息Id   stallInfoId
     *      车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * 方法: 1.判断stallInfoId是否存在对应的车位信息 若不存在则抛异常 下架不抛异常
     *      2.将车位信息放入Dto返回
     * */
    @GetMapping("/stallInfo/selectStallInfoById2")
    @ApiOperation("根据ID查询车位相关信息 无论是否下架")
    Result<StallDto> selectStallInfoById2(@RequestParam("stallInfoId") Integer stallInfoId);
    /**
     * 根据车位信息ID查询车位出租时间计划
     * 参数: 车位信息Id       stallInfoId
     * 返回: 是否有出租计划    isPlan 0有出租计划 1没有出租计划(默认全天候出租)
     *      出租计划开始日期   startDate
     *      出租计划结束日期   endDate
     *      每日计划时间组     planTimes
     *                      开始时间      startTime
     *                      结束时间      endTime
     *                      举例 8点-12点 14点-18点 22点-24点 被表示为 {[startTime:8,endTime:12],[startTime:14,endTime:18],[startTime:22,endTime:24]}
     * 返回参数的条件:
     *       1. startDate<endDate
     *       2. planTimes 非空集 每个元素中 startTime取值0-23 endTime取值1-24 startTime<endTime
     *       3. planTimes 各个元素间不能交叉 也不能连续
     * 方法: 1.判断stallInfoId是否存在对应的车位信息 若不存在则抛异常 若下架也抛异常
     *      2.将车位出租计划放入Dto中返回
     * */
    @GetMapping("/stallInfo/selectStallRentById")
    @ApiOperation("根据车位信息ID查询车位出租时间计划")
    Result<StallRentDto> selectStallRentById(@RequestParam("stallInfoId") Integer stallInfoId);
    /**
     * 根据出租客信息ID查询车位信息
     * 参数: 出租客信息Id   rentersInfoId
     * 返回: 车位信息Id   stallInfoId
     *      车位区域     stallInfoArea
     *      车位编号     stallInfoNum
     *      车位类型     stallType 0普通 1充电
     *      物业信息Id   certifiedInfoId
     *      出租客信息Id rentersInfoId
     * 方法: 1.查询rentersInfoId对应的所有车位 不论是否下架
     *      2.将车位信息放入Dto返回
     * */
    @GetMapping("/stallInfo/selectStallInfoByRentersId")
    @ApiOperation("根据出租客信息Id查询车位信息")
    Result<List<StallDto>> selectStallInfoByRentersId(@RequestParam("rentersInfoId") Integer rentersInfoId);
}
